package com.youdianda.service.impl;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youdianda.constant.MessageConstant;
import com.youdianda.dto.SysRoleAddDTO;
import com.youdianda.dto.SysRolePageDTO;
import com.youdianda.entity.SysMenu;
import com.youdianda.entity.SysRole;
import com.youdianda.entity.SysRoleMenu;
import com.youdianda.mapper.SysMenuMapper;
import com.youdianda.mapper.SysRoleMapper;
import com.youdianda.mapper.SysRoleMenuMapper;
import com.youdianda.result.PageResult;
import com.youdianda.result.Result;
import com.youdianda.service.ISysRoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youdianda.vo.SysRolePageVO;
import com.youdianda.vo.SysRoleUpdateVO;
import com.youdianda.vo.SysRoleVO;
import org.apache.velocity.runtime.directive.contrib.For;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 角色表 服务实现类
 * </p>
 *
 * @author sdy
 * @since 2023-05-15
 */
@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService {
    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;
    @Autowired
    private SysMenuMapper sysMenuMapper;

    @Autowired
    private SysRoleMapper sysRoleMapper;

    /**
     * 分页查询角色列表
     *
     * @param dto
     * @return
     */
    @Override
    public Result roleList(SysRolePageDTO dto) {
        //创建分页
        IPage<SysRole> rolePage = new Page<>(Integer.parseInt(dto.getPage()), Integer.parseInt(dto.getLimit()));

        //根据姓名进行模糊查询
        IPage<SysRole> page = page(rolePage, Wrappers.<SysRole>lambdaQuery().like(dto.getName() != null, SysRole::getName, dto.getName()));

        SysRolePageVO sysRolePageVO = SysRolePageVO.builder()
                .currentPage(page.getCurrent())
                .data(page.getRecords())
                .currentPage(page.getPages())
                .pageSize(page.getSize())
                .totalPages(page.getTotal())
                .build();
        System.out.println("__________________________"+page.getRecords());
        return Result.success(sysRolePageVO);
    }

    /**
     * 根据id查询用户 回显修改用
     *
     * @param id
     * @return
     */
    @Override
    public Result roleRowInfo(String id) {
        //非空判断
    /*    boolean equals = equals(id);
        if (equals != true) {
            return Result.error(MessageConstant.ACCOUNT_NOT_FOUND);
        }*/
        //通过id查询该姓名和id
        /*SysRole one = getOne(Wrappers.<SysRole>lambdaQuery().eq(SysRole::getId, id));
        List<SysRoleMenu> sysRoleMenusList = sysRoleMenuMapper.selectList(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getRoleId, id));
        //遍历这个集合来获取对应menu表中的所有的数据
        //创建一个集合来保存这个数据
        List<SysMenu> menuList = new ArrayList<>();//第一级
        sysRoleMenusList.forEach(sysMenuId -> {
            SysMenu sysMenu = sysMenuMapper.selectById(sysMenuId.getMenuId());
            //获取了一级的四个数据
            if (sysMenu.getPid() == 0)
                menuList.add(sysMenu);
        });
        menuList.forEach(s2 -> {
            List<SysMenu> list3 = sysMenuMapper.selectList(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getPid, s2.getId()));
            s2.setChildren(list3);
            list3.forEach(s3 -> {
                List<SysMenu> list = sysMenuMapper.selectList(Wrappers.<SysMenu>lambdaQuery().eq(SysMenu::getPid, s3.getId()));
                s3.setChildren(list);
            });
        });
        SysRoleVO sysRoleVO = SysRoleVO.builder()
                .id(getId)
                .name(name)
                .description(one.getDescription())
                .remarks(null)
                .superadmin(one.getSuperadmin())
                .roleId(null)
                .authList(menuList)
                .build();
        return Result.success(sysRoleVO);*/

// --------------------------------------------------------------------------------------------------------------------------------------
        //根据id获取role对象
       /* SysRole one = getOne(Wrappers.<SysRole>lambdaQuery().eq(SysRole::getId, id));
        //根据role的主键来获取对应的权限
        List<SysRoleMenu> sysRoleMenuLists = sysRoleMenuMapper.selectList(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getRoleId, id));
        //遍历这个集合取出pid对应0的父级  创建两个集合 一个用来保存父级集合 一个用来保存子集集合
        sysRoleMenuLists.forEach(sysRoleMenu->{
            SysMenu sysMenu = sysMenuMapper.selectById(sysRoleMenu.getMenuId());
        });*/
        //创建一个集合用来保存最终vo的集合  再利用父级集合和子集集合进行递归
      /*  List<SysMenu> authList=new ArrayList<>();
        for (SysMenu sysMenu : sysMenulist) {
            authList.add(getChildren(sysMenu,ChildrenList));
        }*/
//-------------------------------------------------------------------------------------------------------------------------------------
        //根据id获取对象
        SysRole one = getOne(Wrappers.<SysRole>lambdaQuery().eq(SysRole::getId, id));
        //根据id查询中间表对应的字段
        List<SysRoleMenu> sysRoleMenus = sysRoleMenuMapper.selectList(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getRoleId, one.getId()));
        //遍历集合 获取对应的menu_id
        //创建两个个集合进行封装
        List<SysMenu> sysMenuListPid = new ArrayList<>();//主节点集合
        List<SysMenu> sysMenuListId = new ArrayList<>();//子节点集合
        for (SysRoleMenu sysRoleMenu : sysRoleMenus) {
            SysMenu sysMenu = sysMenuMapper.selectById(sysRoleMenu.getMenuId());
            if (sysMenu.getPid().equals(0)) {
                sysMenuListPid.add(sysMenu);
            } else {
                sysMenuListId.add(sysMenu);
            }
        }
        //这个时候遍历父节点集合 遍历子集合的元素 看子集合的元素是否与父集合的pid相当 相等的话就是找到了子集
        //定义两个集合来接收数据
        List<SysMenu> list2 = new ArrayList<>();
        List<SysMenu> list3 = new ArrayList<>();
        sysMenuListPid.forEach(s1 -> {
            sysMenuListId.forEach(s2 -> {
                if (s1.getId().equals(s2.getPid())) {
                    //找到了子集
                    list2.add(s2);
                }
            });
            list2.forEach(s3 -> {
                sysMenuListId.forEach(s4->{
                    if (s3.getId().equals(s4.getPid())){
                        //找到子集了
                        list3.add(s4);
                    }
                });
                s3.setChildren(list3);
            });
            s1.setChildren(list2);
        });
        //封装数据
        SysRoleVO sysRoleVO = SysRoleVO.builder()
                .id(one.getId())
                .name(one.getName())
                .description(one.getDescription())
                .remarks(null)
                .superadmin(one.getSuperadmin())
                .roleId(null)
                .authList(sysMenuListPid)
                .build();
        return Result.success(sysRoleVO);
    }

    /**
     * 修改数据
     *
     * @param dto
     * @return
     */
    @Override
    public Result roleUpdate(SysRoleUpdateVO dto) {
        //将dto中的数据进行copy  copy到vo类中  然后再进行调用
        SysRole sysrole =new SysRole();
        sysrole.setId(dto.getId());
        sysrole.setName(dto.getName());
        sysrole.setDescription(dto.getDescription());
        sysrole.setUpdateDate(LocalDateTime.now());
        updateById(sysrole);

        SysRole byId = getById(dto.getId());
        //根据id干掉中间表的所有数据
        String id = byId.getId();

        sysRoleMenuMapper.deleteByMenuId1(id);

        //获取请求中的集合 遍历集合 根据id添加到中间表
        List<Integer> menuids = dto.getMenuids();
        for (Integer menuid : menuids) {
            SysRoleMenu sysRoleMenu = new SysRoleMenu();
            sysRoleMenu.setMenuId(menuid.toString());
            sysRoleMenu.setRoleId(dto.getId());
            sysRoleMenuMapper.insert(sysRoleMenu);
        }
        //响应结果
        return Result.success();
    }

    /**
     * 新增用户数据
     *
     * @param dto
     * @return
     */
    @Override
    public Result roleAdd(SysRoleAddDTO dto) {
        SysRole sysRole = new SysRole();
        BeanUtils.copyProperties(dto,sysRole);
        sysRole.setCreateDate(LocalDateTime.now());
        sysRole.setUpdateDate(LocalDateTime.now());
        save(sysRole);

        String[] menuids1 = dto.getMenuids();
        for (String menuid : menuids1) {
            SysRoleMenu sysRoleMenu = new SysRoleMenu();
            sysRoleMenu.setRoleId(sysRole.getId());
            sysRoleMenu.setMenuId(menuid);
            sysRoleMenuMapper.insert(sysRoleMenu);
        }
        return Result.success();
    }

    /**
     * 角色列表-全部
     *
     * @return
     */
    @Override
    public Result roleAllData() {
        List<SysRole> sysRoles = sysRoleMapper.selectList1();

        return Result.success(sysRoles);
    }

    /**
     * 根据id删除数据
     *
     * @param id
     * @return
     */
    @Override
    public Result roleDel(String id) {
       if (id==null){
           return Result.error(MessageConstant.ACCOUNT_NOT_FOUND);
       }
       removeById(id);

       sysRoleMenuMapper.deleteByMenuId1(id);


        return Result.success();
    }


    /**
     * 递归  先找出结果  再用结果往上递归  没写了 写不出来
     */
    public List<SysMenu> getChildren(SysMenu sysMenu, List<SysMenu> sysMenuenuList) {
        return null;
    }
}